package com.totoro.redis.list;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 列表命令
 * Created by Administrator on 2017/11/14/014.
 */
@Service
public class ListCommandUtils {
    @Resource
    RedisTemplate redisTemplate;

    /** 将元素插入列表（从左或从右） 返回列表中元素的个数。 **/
    public long lpush_list(Object key, Object value){
        return redisTemplate.opsForList().leftPush(key, value) ;
    }

    public long rpush_list(Object key, Object value){
        return redisTemplate.opsForList().rightPush(key, value) ;
    }

    /** 返回最 左/右 端的元素 **/
    public Object lpop_list(Object key){
        return redisTemplate.opsForList().leftPop(key);
    }

    public Object rpop_list(Object key){
        return redisTemplate.opsForList().rightPop(key);
    }

    /**
     * 返回列表偏移量处的元素
     * @param key
     * @param offset
     * @return
     */
    public Object lindex_list(Object key, long offset){
        return redisTemplate.opsForList().index(key, offset);
    }

    /**
     * 返回偏移范围内的元素列表
     * @param key
     * @param begin
     * @param end
     * @return
     */
    public List<Object> lrange_list(Object key, long begin, long end){
        return redisTemplate.opsForList().range(key, begin, end);
    }

    /**
     * 修剪列表
     * 包括偏移量begin 和end 以及偏移范围的元素会被保留，其余元素全部删除
     * @param key
     * @param begin
     * @param end
     */
    public void ltrim_list(Object key, long begin, long end){
        redisTemplate.opsForList().trim(key, begin, end);
    }

    /**
     * 从src的右边找出元素A插入des的左边
     * @param keySrc
     * @param keyDest
     * @return 返回这个元素
     */
    public Object rpoplpush_list(Object keySrc, Object keyDest){
        return redisTemplate.opsForList().rightPopAndLeftPush(keySrc, keyDest);
    }
}
